package gjbsh.bangong.ds.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.druid.util.StringUtils;

import gjbsh.bangong.ds.dao.单位Mapper;
import gjbsh.bangong.ds.model.单位;
import gjbsh.bangong.ds.model.单位Example;
import gjbsh.share.DeptType;
import gjbsh.support.AppGlobalConfig;
import gjbsh.support.BooleanMessage;
import gjbsh.support.LoginUser;

/**
 * @author yaolongjun
 * @date   2020年5月12日 下午2:55:31
 */
@Service
public class 单位Service {
	
	@Value("${userid}")
	private String userid;
	
	@Autowired
	单位Mapper ddMapper;
	
	@Autowired
	单位类型Service dd单位类型Service;
	
	@Autowired
	单位流动站Service dd单位流动站Service;
	
	@Autowired
	单位扩展信息工作站设站单位Service dd单位扩展信息工作站设站单位Service;
	
	@Autowired
	单位附加信息Service dd单位附加信息Service;

	public List<Map<String, Object>> findxiaji(String jianzhi, String deptid) {
		return ddMapper.findxiaji(jianzhi,deptid);
	}

	// 查询某单位
	public 单位 findOne(String ppDeptId) {
		return ddMapper.selectByPrimaryKey(ppDeptId);
	}

	// 根据单位ID查询单位 
	public Map<String,Object> findCustomByDeptId(String ppDeptId) {
		return ddMapper.findCustomByDeptId(ppDeptId);
	}

	// 根据单位ID查询下级单位类型，以及对应单位类型的单位 
	public List<Map<String,Object>> findXjdwleixingAndXjdwByDeptId(String ppDeptId, String ppCurrentDanweileixingId) {
		
		// 存放下级单位类型及对应下级单位的list
		List<Map<String,Object>> mmResultList = new ArrayList<Map<String,Object>>();
		
		// 根据单位ID查询下级单位类型
		List<Map<String,Object>> mmXjdwleixingList = dd单位类型Service.findXjdwleixingByDeptId(ppDeptId);
		if(mmXjdwleixingList.size() < 1) {
			return mmResultList;
		}
		
		// 根据父单位ID查询下级单位
		List<Map<String, Object>> mmXjdwList = findByParentDeptId(ppDeptId,ppCurrentDanweileixingId);
		
		for(int i = 0; i < mmXjdwleixingList.size(); i++) {
			Map<String,Object> mmXjdwleixing = mmXjdwleixingList.get(i);
			if(mmXjdwleixing == null) {
				continue;
			}
			
			String mmDanweileixingId = mmXjdwleixing.get("单位类型ID") == null ? "" : mmXjdwleixing.get("单位类型ID").toString();
			String mmDanweileixingMingcheng = mmXjdwleixing.get("单位类型名称") == null ? "" : mmXjdwleixing.get("单位类型名称").toString();
			
			// 不显示军队单位
			if(mmDanweileixingId.equals(DeptType.军队)) {
				continue;
			}
			
			
			Map<String,Object> mmXjdwAndDanweileixing = new HashMap<String,Object>();
			mmXjdwAndDanweileixing.put("单位类型ID", mmDanweileixingId);
			mmXjdwAndDanweileixing.put("单位类型名称", mmDanweileixingMingcheng);
			
			List<Map<String,Object>> mmTongdwlxDanweiList = new ArrayList<Map<String,Object>>();
			// 循环下级单位list,找出该单位类型的下级单位
			for(int j = 0; j < mmXjdwList.size(); j++) {
				Map<String, Object> mmXjdw = mmXjdwList.get(j);
				if(mmXjdw != null) {
					String mmXjdwleixingId = mmXjdw.get("单位类型ID") == null ? "" : mmXjdw.get("单位类型ID").toString();
					if(mmXjdwleixingId.equals(mmDanweileixingId)) {
						mmTongdwlxDanweiList.add(mmXjdw);
					}
				}
			}
			mmXjdwAndDanweileixing.put("下级单位", mmTongdwlxDanweiList);
			
			if(mmTongdwlxDanweiList.size() > 0) {
				mmResultList.add(mmXjdwAndDanweileixing);
			}
		}
		
		return mmResultList;
	}

	// 根据父单位ID查询下级单位
	private List<Map<String,Object>> findByParentDeptId(String ppDeptId,String ppCurrentDanweileixingId) {
		return ddMapper.findByParentDeptId(ppDeptId,ppCurrentDanweileixingId);
	}

	// 根据单位所属详细部门ID查询部委直属下级单位 
	public List<Map<String,Object>> findBelongToOrganByDeptId(String ppDeptId) {
		return ddMapper.findBelongToOrganByDeptId(ppDeptId);
	}
	
	// 根据单位所属详细部门ID和单位名称查询部委直属下级单位 
	public List<Map<String, Object>> findBelongToOrganByDeptIdAndDeptname(String ppSuosuXiangxibumenId,
			String ppDeptName) {
		return ddMapper.findBelongToOrganByDeptIdAndDeptname(ppSuosuXiangxibumenId,ppDeptName);
	}

	// 根据单位名称查找单位
	public 单位 findOneByDeptname(String ppDeptName) {
		单位Example mmExample = new 单位Example();
		单位Example.Criteria criteria = mmExample.createCriteria();
		criteria.and单位名称EqualTo(ppDeptName);
		List<单位> mmList = ddMapper.selectByExample(mmExample);
		return mmList.size() == 1 ? mmList.get(0) : null;
	}
	
	// 通过单位名称 查找单位（百分百匹配）
	
	public List<Map<String,Object>> findCustomByDeptname(String ppDeptName) {
		return ddMapper.findCustomByDeptname(ppDeptName);
	}
	
	// 根据单位类型ID查询该类型单位的扩展信息
	public BooleanMessage findDeptExpandByDeptTypeId(String ppDeptTypeId, HttpServletRequest request) {
		// 是否允许设置流动站
		boolean mmShifouyunxuSetLiudongzhan = DeptType.getAllowSetLiudongzhan(ppDeptTypeId);
		// 当不允许设置流动站时，是否允许显示流动站
		boolean mmShifouShowSetLiudongzhan = false;
		
		if(mmShifouyunxuSetLiudongzhan) {
			// 取配置的userid
			String userid_application = userid;
			
			// 取当前登录用户ID
			LoginUser loginUser = (LoginUser)request.getAttribute(AppGlobalConfig.REQUEST_LOGINUSER_NAME);
			if(loginUser == null) {
				return BooleanMessage.getErrorMessage("无登录信息");
			}
			String mmUserId = loginUser.getUserId() == null ? "" :loginUser.getUserId();
			if("".equals(mmUserId)) {
				return BooleanMessage.getErrorMessage("无登录信息1");
			}
			
			// 判断是否管理员
			if(!userid_application.equals(mmUserId)) {
				mmShifouyunxuSetLiudongzhan = false;
				mmShifouShowSetLiudongzhan = true;
			}
		}
		
		// 是否允许从上级单位的池中选择流动站
		boolean mmShifouyunxuSelectLiudongzhan = DeptType.getAllowSelectLiudongzhan(ppDeptTypeId);
		
		// 是否允许设置单位扩展信息_工作站设站单位(独立招收资格)
		boolean mmShifouyunxuSetGongzuozhan = DeptType.getAllowSetGongzuozhan(ppDeptTypeId);
		
		Map<String,Object> mmExpandMap = new HashMap<String,Object>();
		mmExpandMap.put("IsSetL", mmShifouyunxuSetLiudongzhan);
		mmExpandMap.put("IsSelectL", mmShifouyunxuSelectLiudongzhan);
		mmExpandMap.put("IsSetG", mmShifouyunxuSetGongzuozhan);
		mmExpandMap.put("IsShowSetL", mmShifouShowSetLiudongzhan);
		
		return BooleanMessage.getSuccessMessage(mmExpandMap);
	}

	// 查询重复设站单位
	public List<单位> findRecurDept(String mmSupDeptId, String ppDeptName) {
		单位Example mmExample = new 单位Example();
		单位Example.Criteria criteria = mmExample.createCriteria();
		criteria.and上级单位idEqualTo(mmSupDeptId).and单位名称EqualTo(ppDeptName)
		.and单位类型idNotEqualTo(DeptType.非设站单位).and单位类型idNotEqualTo("jl50")
		.and状态EqualTo(BigDecimal.valueOf(100));
		return ddMapper.selectByExample(mmExample);
	}
	
	// 新增
	public boolean add(单位 mmDept) {
		return ddMapper.insert(mmDept) == 1;
	}	
	
	// 修改
	public boolean modify(单位 mmDept) {
		return ddMapper.updateByPrimaryKey(mmDept) == 1;
	}
	
	// 修改单位信息
	@Transactional
	public boolean modifyCustom(单位 mmDept, String ppDeptSsxxbumenId, String ppDeptliudongzhanids,int ppDeptdulizhaoshou,
			boolean mmShifouyunxuSetL, boolean mmShifouyunxuSelectL, boolean mmShifouyunxuSetG) {
		// 修改
		if(!modify(mmDept)) {
			throw new RuntimeException("修改单位失败");
		}
		
		// 更新单位所属详细部门
		if(!dd单位附加信息Service.updateDeptSuoshubumen(mmDept.get单位id(),ppDeptSsxxbumenId)) {
			throw new RuntimeException("更新单位所属详细部门失败");
		}
		
		// 更新单位_流动站
		if(mmShifouyunxuSetL || mmShifouyunxuSelectL) {
			if(!dd单位流动站Service.updateDeptLiudongzhan(mmDept.get单位id(),ppDeptliudongzhanids)) {
				throw new RuntimeException("更新单位_流动站失败");
			}
		}
		
		// 更新单位扩展信息_工作站设站单位(独立招收资格)
		if(mmShifouyunxuSetG) {
			if(!dd单位扩展信息工作站设站单位Service.updateDeptDulizhaoshou(mmDept.get单位id(),ppDeptdulizhaoshou)) {
				throw new RuntimeException("更新单位扩展信息_工作站设站单位失败");
			}
		}
		
		return true;
	}

	// 新增单位信息
	@Transactional
	public boolean addCustom(单位 mmDept, String ppDeptSsxxbumenId, String ppDeptliudongzhanids, int ppDeptdulizhaoshou,
			boolean mmShifouyunxuSetL, boolean mmShifouyunxuSelectL, boolean mmShifouyunxuSetG) {
		// 新增
		if(!add(mmDept)) {
			throw new RuntimeException("新增单位失败");
		}
		
		// 新增单位所属详细部门
		if(!dd单位附加信息Service.updateDeptSuoshubumen(mmDept.get单位id(),ppDeptSsxxbumenId)) {
			throw new RuntimeException("更新单位所属详细部门失败");
		}
		
		// 更新单位_流动站
		if(mmShifouyunxuSetL || mmShifouyunxuSelectL) {
			if(!dd单位流动站Service.updateDeptLiudongzhan(mmDept.get单位id(),ppDeptliudongzhanids)) {
				throw new RuntimeException("更新单位_流动站失败");
			}
		}
		
		// 更新单位扩展信息_工作站设站单位(独立招收资格)
		if(mmShifouyunxuSetG) {
			if(!dd单位扩展信息工作站设站单位Service.updateDeptDulizhaoshou(mmDept.get单位id(),ppDeptdulizhaoshou)) {
				throw new RuntimeException("更新单位扩展信息_工作站设站单位失败");
			}
		}
		
		return true;
	}

	// 根据单位类型和省份ID和地区ID查询单位
	public List<Map<String, Object>> findByDepttypeAndShengfenIdAndDiquId(List<String> ppDepttypeIdList,
			String ppShengfenId, String ppDiquId) {
		return ddMapper.findByDepttypeAndShengfenIdAndDiquId(ppDepttypeIdList,ppShengfenId,ppDiquId);
	}
	
	// 根据单位ID查询该单位的下级单位
	public List<单位> findSubDeptByDeptId(String ppDeptId) {
		单位Example mmExample = new 单位Example();
		单位Example.Criteria criteria = mmExample.createCriteria();
		criteria.and上级单位idEqualTo(ppDeptId).and状态EqualTo(BigDecimal.valueOf(100));
		return ddMapper.selectByExample(mmExample);
	}

	// 统计某一省份的单位
	public List<Map<String, Object>> statisticsDeptBySheng(String ppShengfenId) {
		return ddMapper.statisticsDeptBySheng(ppShengfenId);
	}
	
	// 统计所有省份的单位
	public List<Map<String, Object>> statisticsDeptOfAllSheng() {
		return ddMapper.statisticsDeptOfAllSheng();
	}
	
	// 根据条件查询单位类型为10，15的省份单位
	public List<Map<String, Object>> findShengDept(String ppShengname) {
		return ddMapper.findShengDept(ppShengname);
	}
	
	// 计算某省份分站数
	public int countGongzuozhanFenzhan(String ppJianzhiXlbm) {
		Object mmFenzhanshu = ddMapper.countGongzuozhanFenzhan(ppJianzhiXlbm);
		return mmFenzhanshu == null ? 0 : Integer.parseInt(mmFenzhanshu.toString());
	}
	
	// 统计单位的所属省份和地区是该省份地区的设站单位
	public List<Map<String, Object>> statisticsDeptByShengfenIdAndDiquId(String ppShengfenId, String ppDiquId) {
		return ddMapper.statisticsDeptByShengfenIdAndDiquId(ppShengfenId,ppDiquId);
	}
	
	// 根据单位名称查找当前登录单位下的（流动站设站单位、工作站总站）
	public List<Map<String, Object>> findHeaddeptByDeptname(String ppDeptname, String ppJianzhiXlbm) {
		return ddMapper.findHeaddeptByDeptname(ppDeptname,ppJianzhiXlbm);
	}
	
	// 根据建制序列编码和单位名称查询下级单位
	public List<Map<String, Object>> findSubdeptByXlbianmaAndDeptname(String ppXuliebianma, String ppDeptName) {
		return ddMapper.findSubdeptByXlbianmaAndDeptname(ppXuliebianma,ppDeptName);
	}

	
	public void updateJianzhixuliebm(String ppDeptId, String ppJianzhixuliebm) {
		List<单位> mmDeptList = findZhiShuSubDept(ppDeptId);
		if (mmDeptList == null) {
			throw new RuntimeException("查询单位直属下级单位数据异常，单位id=" + ppDeptId);
		}

		for (int i = 0; i < mmDeptList.size(); i++) {
			单位 mmDept = mmDeptList.get(i);
			if (mmDept == null) {
				continue;
			}

			String mmNewJianZhiBM = "";
			String tempBianMa = String.valueOf(i + 1);
			if (tempBianMa.length() == 1) {
				mmNewJianZhiBM = ppJianzhixuliebm + "00" + tempBianMa;
			} else if (tempBianMa.length() == 2) {
				mmNewJianZhiBM = ppJianzhixuliebm + "0" + tempBianMa;
			} else if (tempBianMa.length() == 3) {
				mmNewJianZhiBM = ppJianzhixuliebm + tempBianMa;
			}

			String mmDeptId = mmDept.get单位id();
			if (StringUtils.isEmpty(mmDeptId)) {
				throw new RuntimeException("单位数据异常，单位id=" + mmDeptId);
			}

			mmDept.set建制序列编码(mmNewJianZhiBM);
			if (!modify(mmDept)) {
				throw new RuntimeException("更新单位建制序列编码错误,单位id=" + mmDeptId);
			}

			updateJianzhixuliebm(mmDeptId, mmNewJianZhiBM);
		}
	}
	
	public List<单位> findZhiShuSubDept(String ppDeptId) {
		单位Example example = new 单位Example();
		单位Example.Criteria criteria = example.createCriteria();
		criteria.and上级单位idEqualTo(ppDeptId);
		example.setOrderByClause("单位类型id asc,单位名称 asc");
		return ddMapper.selectByExample(example);
	}

	// 根据单位ID统计该单位的分站情况
	public List<Map<String, Object>> statisticsFenzhanByDeptId(String ppDeptId) {
		return ddMapper.statisticsFenzhanByDeptId(ppDeptId);
	}

	// 根据单位ID查询该单位的下级单位个数
	public int countSubDeptByDeptId(String ppDeptId) {
		单位Example mmExample = new 单位Example();
		单位Example.Criteria criteria = mmExample.createCriteria();
		criteria.and上级单位idEqualTo(ppDeptId).and状态EqualTo(BigDecimal.valueOf(100));
		return ddMapper.countByExample(mmExample);
	}

	// 按省份计算所有的设站单位个数（20，25，28）
	public List<Map<String, Object>> countAllShezhanDeptGroupbySheng(List<String> mmShengIdList) {
		return ddMapper.countAllShezhanDeptGroupbySheng(mmShengIdList);
	}

	// 计算各省、直辖市各招收类型的招收人数
	public List<Map<String, Object>> countZhaoshourenshuGroupbyShengAndLeixing(String ppStartTime, String ppEndTime) {
		return ddMapper.countZhaoshourenshuGroupbyShengAndLeixing(ppStartTime,ppEndTime);
	}

	// 计算各省、直辖市博士后进站身份类型
	public List<Map<String, Object>> countJzshenfenGroupbySheng(String ppStartTime, String ppEndTime) {
		return ddMapper.countJzshenfenGroupbySheng(ppStartTime,ppEndTime);
	}

	// 计算各省、直辖市各招收类型的在站人数
	public List<Map<String, Object>> countZaizhanrenshuGroupbyShengAndLeixing() {
		return ddMapper.countZaizhanrenshuGroupbyShengAndLeixing();
	}

	//  根据单位ID和被查的单位id 判断是否有权限
	public List<Map<String, Object>> findShangjiByDeptId(String dengludeptid, String beichadeptid) {
		return ddMapper.findShangjiByDeptId(dengludeptid,beichadeptid);
	}
	// 根据批次id的单位id前缀 查询需要分配密码的账户
	public List<Map<String,Object>> findweifenpeibypiciid(String ppDeptId,String ppPiciId) {
		return ddMapper.findweifenpeibypiciid(ppDeptId,ppPiciId);
	}


	// 根据单位ID和下级单位类型ID查询下级单位
//	public List<Map<String,Object>> findByDeptIdAndXjdwleixingId(String ppDeptId,List<String> ppLeixingList) {
//		// TODO Auto-generated method stub
//		return ddMapper.findByDeptIdAndXjdwleixingId(ppDeptId);
//	}

}
